iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0

Agent、Harness、Tool、MCP 這幾個詞在不同框架的文件裡指涉的範圍各有出入,同一個詞在甲專案是協定規範,在乙專案是產品名稱。以下先把六個基礎名詞定義清楚,並一併釐清 Skill 與 Plugin 的差異。


六個名詞

這些名詞在各家文件裡有多種定義,以下取能拿來做判斷的那一種。

LLM

以自我迴歸(autoregressive)方式預測下一個 token 的模型

單次呼叫在數學上是純函式(pure function):

f(context) → tokens

它是無狀態的,副作用(side effect)全部發生在呼叫端:

  • 寫入檔案由呼叫端執行
  • HTTP 請求由呼叫端發出
  • 上一輪的對話內容由呼叫端重送

連續對話之所以看起來有記憶,是因為呼叫端每次都把先前的訊息一併重送進去。

同樣的輸入在不同時間得到不同結果時,變因來自模型以外的地方。

Agent

能夠在迴圈中呼叫工具、觀察執行結果、據此決定下一步的系統

最小結構是三步一循環,觀察 → 決策 → 行動,行動產生的結果回到觀察,成為下一輪的輸入。

跟對話式介面的差異落在兩件事:

  1. 上面這個迴圈是否存在
  2. 是否能產生外部副作用

拿 ChatGPT 網頁版當例子,貼一段程式碼請它解釋,那是對話式介面,它自己搜尋網頁、讀取結果、再決定是否繼續搜尋,那就是 agent。

同一個模型,差別在外層。

Harness

包覆 Model 的執行框架,決定它看得到什麼輸入、被允許呼叫什麼、輸出如何被驗證

這個詞在軟體測試領域已經有既定用法,兩者結構相同,目的不同:

test harness agent harness
受測體 受測程式 Model
做的事 提供輸入、擷取輸出、比對預期值 供給輸入、接收輸出、決定接下來怎麼處理
目的 跑完一輪,判定通過或失敗 讓執行持續下去,驗證失敗時決定重試、改路徑或中止

harness 對受測程式是透明的,對 Model 也一樣。

Tool

一個具名的函式宣告,包含名稱、參數 schema 與用途描述

工具由 harness 執行,流程分四步:

  1. harness 把工具清單送進 context
  2. 模型輸出一段結構化請求,內容是「要呼叫哪個工具、帶什麼參數」
  3. harness 收到請求,決定執行、拒絕,或要求人工確認
  4. 真正發出 HTTP 請求或寫入檔案的是 harness

第 3 步是授權邊界唯一能存在的位置,決策與執行在這裡分開,攔截點才有地方落。

工具宣告是資料(一段 JSON schema),工具執行是程式碼,兩者分屬不同的位置。

MCP

Model Context Protocol,一份以 JSON-RPC 為基礎的協定規範,定義 client 與 server 之間如何列出工具、呼叫工具、回傳結果

它是規範文件,實作由各方提供。官方 SDK 目前涵蓋十種語言,依功能完整度、協定支援與維護承諾分三個 tier:TypeScript、Python、C#、Go、Rust 列在 Tier 1,Java 與 Ruby 在 Tier 2,Swift、PHP、Kotlin 在 Tier 3。

實際安裝的對象是:

  • 某一個 MCP server
  • 或某一套 MCP SDK

MCP 要解決的是 M×N 問題:

情境 需要幾份介接程式碼
各自介接,M 個 agent 框架各自接 N 種工具 M×N
經由 MCP,工具側實作 server、agent 側實作 client M+N

兩邊各做一次,換掉 agent 框架時工具側沿用同一份 server。

Context Window

模型單次推論可接受的 token 上限

這個名詞看起來最單純,它是三個數字取最小值:

層 由誰決定 出問題時的現象
模型能力 模型權重與位置編碼的訓練範圍 超出後輸出品質下降,過程靜默
伺服器配置 推論伺服器啟動時的執行期參數 vLLM 直接回傳錯誤,Ollama 靜默截掉超出的部分
API 協定 端點是否接受該參數 參數送出後被忽略,行為維持預設值

三層任何一層卡住,實際可用的就是那一層的數字。常見的組合是模型檔宣告 128K、推論伺服器啟動參數壓在 32K、而設定用的那個 API 端點忽略該參數,最後真正能用的是 32K。

所以 context window 這個數字只有指明層級時才有意義,同一個名詞在三層各自對應一個值。


Skill 與 Plugin 的差別

Skill 的定義各家一致,plugin 這個詞則有兩種用法:

  • 打包單位:把 skills、hooks、MCP server 設定包成一個可安裝的東西,內容由清單檔描述
  • 程式碼擴充:runtime 內的模組,行程啟動時載入,能改變 runtime 的行為

「Skill 與 Plugin 的差異」這個問題的答案取決於是哪一種 plugin。以下取程式碼擴充這種來對照:

Agent Skill Plugin(程式碼擴充)
本質 檔案形式的指令集與資源 runtime 內的程式碼
載入時機 模型讀取時進入 context 行程啟動時載入
消耗 佔用 context window 佔用記憶體
出事範圍 範圍限於該技能,其餘功能照常 可能導致 runtime 啟動失敗
可攜性 複製檔案即可移轉 綁定該 runtime 的擴充介面

Skill 改變模型知道什麼,Plugin 改變 runtime 能做什麼

這句話在程式碼擴充那種用法下成立。plugin 當打包單位時,skill 可以裝進 plugin 一起散布。

MCP server 是第三種擴充方式,工具跑在另一個行程。


六者的抽象層級

  • Agent:具備迴圈與副作用能力的系統
    • LLM:無狀態的預測函式
      • Context Window:單次推論的輸入上限
    • Harness:決定輸入、授權與驗證
      • Tool:具名的函式宣告
      • MCP:工具介接的協定規範

從這個層級可以看出 Agent 底下的兩個分支能各自替換:

  • 換掉 LLM,Harness 的組態維持原狀
  • 換掉 MCP server,模型選擇維持原狀

Agent


名詞整理

名詞 一句話定義 實際情形
LLM 無狀態的 token 預測函式 先前的對話由呼叫端每次重送
Agent 具備觀察決策行動迴圈、能產生副作用的系統 迴圈與副作用兩項同時成立才算
Harness 決定 Model 的輸入、授權與輸出驗證的執行框架 與測試領域的 test harness 結構相同、目的不同
Tool 具名的函式宣告 執行者是 harness
MCP 工具介接的協定規範 安裝的對象是某個 server 或某套 SDK
Context Window 單次推論的 token 上限 實際值是三層取最小

心得

把 agent 接上一台地端推論伺服器時卡了很久,原因跟名詞有關。

那個模型檔宣告支援 128K,agent 這端要求至少 64K,照理說綽綽有餘,實際跑起來每次都在 32K 被截斷。當時的判斷是參數帶錯,反覆改送出去的 num_ctx,改了幾輪,數字維持原樣。

後來拆開看,是兩件事同時發生:

  1. 推論伺服器啟動時就把上限設在 32K,模型檔宣告的 128K 從那一刻起就被壓在 32K
  2. 我一直在調的那個參數走的是 OpenAI 相容端點,那條路徑會忽略它,原生 API 才解析這個欄位

真正的原因是把「模型支援 128K」和「這個端點願意給我 128K」當成同一句話。這兩件事在 context window 底下屬於不同層,名詞的層級一旦混用,除錯方向從第一步就偏了。

明天

換另一組名詞,agent 工程的四個範式,以及 Loop Engineering、Spec-Driven Development、Verifier Loop 之間的關係。


上一篇
【Day 1】前言:從「能動」到「能一直動」
下一篇
【Day 3】名詞定義(下):Agent 工程的四個範式與相關方法論
系列文
打造具備記憶與執行能力的常駐 AI Agent:Hermes Agent × Gemini × MCP 的 Harness 設計 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言